import { LngLat } from '../entity/lngLat'
import { Point } from '../entity/point'

import { Overlay } from './overlay'
import { DefinedOverlayTypeEnum } from './enum'

/**
 * 文本标注的属性对象
 */
export interface LabelOptions {
    /**
     * 文本标注的内容
     *
     * 默认值为 `''`
     */
    text?: string;

    /**
     * 文本标注的位置偏移值
     *
     * 默认值为 `Point(0, 0)`
     */
    offset?: Point;

    /**
     * 文本标注的内容
     *
     * 默认值为 `LngLat(0, 0)`
     */
    position?: LngLat
}

/**
 * 文本标注事件工厂对象
 */
type LabelEventFactory = {
    /**
     * 点击多边形后会触发此事件
     */
    click: (event: { type: 'click', target: Label, lnglat: LngLat, containerPoint: Point }) => void;

    /**
     * 双击多边形后会触发此事件
     */
    dblclick: (event: { type: 'dblclick', target: Label, lnglat: LngLat, containerPoint: Point }) => void;

    /**
     * 鼠标在多边形上按下触发此事件
     */
    mousedown: (event: { type: 'mousedown', target: Label, lnglat: LngLat, containerPoint: Point }) => void;

    /**
     * 鼠标在多边形释放触发此事件
     */
    mouseup: (event: { type: 'mouseup', target: Label, lnglat: LngLat, containerPoint: Point }) => void;

    /**
     * 鼠标离开多边形时触发此事件
     */
    mouseout: (event: { type: 'mouseout', target: Label, lnglat: LngLat, containerPoint: Point }) => void
}

/**
 * 此类表示地图上的文本标注
 */
export interface Label extends Overlay {
    /**
     * 根据给定参数对象创建文本标注
     *
     * @param opts 文本标注的属性对象
     */
    new (opts: LabelOptions): Label;

    /**
     * 叠加层类型
     */
    getType: () => DefinedOverlayTypeEnum.Label;

    /**
     * 返回文本所在的地理位置坐标
     */
    getLngLat: () => LngLat;
    /**
     * 设置文本所在的地理位置坐标
     *
     * @param lnglat 地理位置坐标
     */
    setLngLat: (lnglat: LngLat) => void;

    /**
     * 返回文本的偏移值
     */
    getOffset: () => Point;
    /**
     * 设置文本的偏移值
     *
     * @param offset 偏移值（像素）
     */
    setOffset: (offset: Point) => void;

    /**
     * 返回文本的内容
     */
    getLabel: () => string;
    /**
     * 设置文本的内容
     *
     * @param content 文本的内容
     */
    setLabel: (content: string) => void;

    /**
     * 返回文本的提示内容
     */
    getTitle: () => string;
    /**
     * 设置文本的提示内容
     *
     * @param title 文本的提示内容
     */
    setTitle: (title: string) => void;

    /**
     * 设置文本的 `z-index`
     */
    setZindex: (zIndex: number) => void;

    /**
     * 返回文本内容字体大小
     */
    getFontSize: () => number;
    /**
     * 设置文本内容字体大小
     *
     * @param fontSize 字体大小
     */
    setFontSize: (fontSize: number) => void;

    /**
     * 返回文本的字体颜色
     */
    getFontColor: () => string;
    /**
     * 设置文本的字体颜色
     *
     * @param color 字体颜色
     */
    setFontColor: (color: string) => void;

    /**
     * 返回文本的背景色
     */
    getBackgroundColor: () => string;
    /**
     * 设置文本的背景色
     *
     * @param color 背景颜色
     */
    setBackgroundColor: (color: string) => void;

    /**
     * 返回文本的边框线宽
     */
    getBorderLine: () => number;
    /**
     * 设置文本的边框线宽
     *
     * @param width 边框线宽
     */
    setBorderLine: (width: number) => void;

    /**
     * 返回文本的边框颜色
     */
    getBorderColor: () => string;
    /**
     * 设置文本的边框颜色
     *
     * @param color 边框颜色
     */
    setBorderColor: (color: string) => void;

    /**
     * 返回文本的显示不透明度
     */
    getOpacity: () => number;
    /**
     * 设置文本的显示不透明度
     *
     * @param opacity 显示不透明度（范围 `0-1` 之间）
     */
    setOpacity: (opacity: number) => void;

    /**
     * 添加事件监听函数
     */
    addEventListener: <Event extends keyof LabelEventFactory>(event: Event, handler: LabelEventFactory[Event]) => void;

    /**
     * 移除事件监听函数
     */
    removeEventListener: <Event extends keyof LabelEventFactory>(event: Event, handler: LabelEventFactory[Event]) => void
}
